use actix_web::{App, HttpServer, Responder, web};
use std::net::UdpSocket;

// 异步函数，返回一个实现了Responder trait的类型
async fn index() -> impl Responder {
    // 返回一个字符串，其中包含一个加粗的 "Hello World!"
    "Hello <strong>World!</strong>"
}

// 异步函数，返回一个实现 Responder 接口的字符串
async fn about() -> impl Responder {
    "About Page"
}

// 使用异步函数获取本地IP地址
async fn get_ip() -> Option<String> {
    // 尝试绑定一个UDP套接字到任意可用的本地接口地址
    let socket = match UdpSocket::bind("0.0.0.0:0") {
        Ok(s) => s,
        Err(_) => return None, // 绑定失败时返回None
    };

    // 尝试连接到Google的服务器
    match socket.connect("8.8.8.8:80") {
        Ok(()) => (),
        Err(_) => return None, // 连接失败时返回None
    };

    // 返回本地地址的IP字符串
    return match socket.local_addr() {
        Ok(addr) => Some(addr.ip().to_string()),
        Err(_) => None, // 获取本地地址失败时返回None
    };
}


#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // 创建一个新的HttpServer实例
    HttpServer::new(|| {
        // 创建一个新的App实例
        App::new()
            // 添加一个路由，匹配路径为"/app/index.html"的GET请求，并将其转发给index函数处理
            .service(
                web::scope("/app")
                    .route("/index.html", web::get().to(index))
                    // 添加一个路由，匹配路径为"/app/about"的GET请求，并将其转发给about函数处理
                    .route("/about", web::get().to(about))
                    // 添加一个路由，匹配路径为"/app/ip"的GET请求，并将其转发给get_ip函数处理
                    .route("/ip", web::get().to(get_ip))
            )
            // 添加一个路由，匹配路径为"/help/index"的GET请求，并将其转发给index函数处理
            .service(
                web::scope("/help")
                    .route("/index", web::get().to(index))
                    // 添加一个路由，匹配路径为"/help/about"的GET请求，并将其转发给about函数处理
                    .route("/about", web::get().to(about))
            )
    })
    // 绑定服务器的监听地址为127.0.0.1:8080
    .bind(("127.0.0.1", 8080))?
    // 运行HttpServer实例
    .run()
    // 等待服务器运行完成
    .await
}
